﻿using System;
using System.Data;
using System.Globalization;
using System.Windows.Forms;
using _1.Presentacion.Principal;
using _1.Presentacion.Properties;
using _1.Presentacion.Utilidades;
using _2.Logica.Eventos;
using _4.Modelado.Eventos;

namespace _1.Presentacion.Modulo_Eventos
{
    public partial class Gestionar_Eventos : Päntalla_Base
    {
        public int PKEvento;
        public Gestionar_Eventos()
        {
            InitializeComponent();
        }

        #region Eventos

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            try
            {
                Validaciones.LimpiarControles(gbEventos);
                dgvDetalleAjuste.DataSource = null;
            }
            catch
            {
                MessageBox.Show(Resources.MensajeErrorSistema);
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidacionesGuardaEvento())
                {
                    if (
                        MessageBox.Show("¿Esta Seguro que quiere salvar este evento?", "Confirmacion",
                                        MessageBoxButtons.YesNo) == DialogResult.Yes)
                        GuardarEvento();
                }
            }
            catch
            {
                MessageBox.Show(Resources.MensajeErrorSistema);
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                if (
                    MessageBox.Show("¿Esta Seguro que quiere el Evento este evento?", "Confirmacion",
                                    MessageBoxButtons.YesNo) == DialogResult.Yes)
                    EliminarEvento();
            }
            catch
            {
                MessageBox.Show(Resources.MensajeErrorSistema);
            }
        }

        private void btnNuevoAsistente_Click(object sender, EventArgs e)
        {
            try
            {
                Validaciones.LimpiarControles(gbAsistentes);
                CargarMiembros(Convert.ToInt32(txtCodigo.Text));

                txtMontoAbono.Text = "0";
            }
            catch
            {
                MessageBox.Show(Resources.MensajeErrorSistema);
            }
        }

        private void btnGuardarAsistente_Click(object sender, EventArgs e)
        {
            try
            {

                if (ValidacionesGuardaMiembro())
                {
                    if (MessageBox.Show("¿Esta Seguro que quiere salvar?", "Confirmacion", MessageBoxButtons.YesNo) ==
                        DialogResult.Yes)
                        GuardarMiembros();
                }
            }
            catch
            {
                MessageBox.Show(Resources.MensajeErrorSistema);
            }
        }

        private void btnEliminarAsistente_Click(object sender, EventArgs e)
        {
            try
            {
                EliminarMiembro();
            }
            catch
            {
                MessageBox.Show(Resources.MensajeErrorSistema);
            }
        }

        private void Gestionar_Eventos_Load(object sender, EventArgs e)
        {
            try
            {
                CargaTiposEventos();
                CargarEventos();
            }
            catch
            {
                MessageBox.Show(Resources.MensajeErrorSistema);
            }
        }

        private void chbAsistentes_CheckedChanged(object sender, EventArgs e)
        {
            gbDetalle.Enabled = chbAsistentes.Checked;
            cbxGratis_CheckedChanged(sender, e);
        }

        private void cbxGratis_CheckedChanged(object sender, EventArgs e)
        {
            txtMontoAbono.Enabled = !cbxGratis.Checked;
            txtMontoAbono.Text = @"0";
        }

        private void dgvEncabezadoAjuste_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                int indicefila = dgvEncabezadoAjuste.SelectedCells[0].RowIndex;
                if (indicefila < 0) return;

                txtContrato.Text = dgvEncabezadoAjuste.Rows[indicefila].Cells["Referencia de Contrato"].Value.ToString();
                txtCodigo.Text = dgvEncabezadoAjuste.Rows[indicefila].Cells["Codigo"].Value.ToString();
                txtNombre.Text = dgvEncabezadoAjuste.Rows[indicefila].Cells["Nombre"].Value.ToString();
                cbxContrato.Checked =
                    Convert.ToBoolean(dgvEncabezadoAjuste.Rows[indicefila].Cells["Contrato"].Value.ToString());
                txtCostoPorPersona.Text =
                    dgvEncabezadoAjuste.Rows[indicefila].Cells["Costo X Persona"].Value.ToString();
                txtUbicacion.Text = dgvEncabezadoAjuste.Rows[indicefila].Cells["Ubicacion"].Value.ToString();
                txtPropuesta.Text = dgvEncabezadoAjuste.Rows[indicefila].Cells["Presupuesto"].Value.ToString();
                chbAsistentes.Checked =
                    Convert.ToBoolean(dgvEncabezadoAjuste.Rows[indicefila].Cells["Registra Asistencia"].Value);
                cbxGratis.Checked = Convert.ToBoolean(dgvEncabezadoAjuste.Rows[indicefila].Cells["Gratis"].Value);
                dtpFechaEvento.Text =
                    (dtpFechaEvento.Value =
                     Convert.ToDateTime(dgvEncabezadoAjuste.Rows[indicefila].Cells["Fecha del Evento"].Value)).ToString();
                dtpFechaInicioCobro.Text =
                    (dtpFechaInicioCobro.Value =
                     Convert.ToDateTime(dgvEncabezadoAjuste.Rows[indicefila].Cells["Facha Inico Cobro"].Value)).ToString
                        ();
                dtpFinalizacionCobro.Text =
                    (dtpFinalizacionCobro.Value =
                     Convert.ToDateTime(dgvEncabezadoAjuste.Rows[indicefila].Cells["Fecha Fin Cobro"].Value)).ToString();

                nudCapacidadEvento.Value =
                    Convert.ToInt32(
                        nudCapacidadEvento.Text =
                        dgvEncabezadoAjuste.Rows[indicefila].Cells["Capacidad"].Value.ToString());

                txtNombre.Focus();


                CargarMiembros(Convert.ToInt32(dgvEncabezadoAjuste.Rows[indicefila].Cells["Codigo"].Value.ToString()));
            }
            catch
            {
                MessageBox.Show(Resources.MensajeErrorSistema);
            }
        }

        private void dgvDetalleAjuste_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                int indicefila = dgvDetalleAjuste.SelectedCells[0].RowIndex;
                if (indicefila < 0) return;

                txtSaldo.Text = (
                    Convert.ToDecimal(txtCostoPorPersona.Text) -
                    Convert.ToDecimal(dgvDetalleAjuste.Rows[indicefila].Cells["Saldo"].Value.ToString())).ToString("0.00");


                txtCodigoAsistente.Text = dgvDetalleAjuste.Rows[indicefila].Cells["PkMiembro"].Value.ToString();
                txtAsistente.Text = dgvDetalleAjuste.Rows[indicefila].Cells["Nombre"].Value.ToString();
            }
            catch
            {
                MessageBox.Show(Resources.MensajeErrorSistema);
            }
        }

        private void btnBuscarAsistente_Click(object sender, EventArgs e)
        {
            try
            {

                if (!txtCodigo.Text.Trim().Equals(string.Empty) && !txtCodigo.Text.Trim().Equals("0"))
                {
                    if (dgvDetalleAjuste.Rows.Count > nudCapacidadEvento.Value)
                    {
                        MessageBox.Show("Ya se Completo la cantidad de asistentes Configurada");
                        return;
                    }

                    btnNuevoAsistente_Click(null, null);
                    PKEvento = Convert.ToInt32(txtCodigo.Text);
                    var pantalla = new Busca_Miembro(this);
                    pantalla.ShowDialog();

                    txtSaldo.Text = txtCostoPorPersona.Text;
                    txtMontoAbono.Text = "0";
                }
                else
                {
              
                    MessageBox.Show("Tienes que guardar primero el evento", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    
                }


            }
            catch (Exception)
            {
            }
        }

        private void txtMontoAbono_KeyPress(object sender, KeyPressEventArgs e)
        {
            Validaciones.SoloNumerosDecimales(e);
        }


        private void txtCostoPorPersona_KeyPress(object sender, KeyPressEventArgs e)
        {
            Validaciones.SoloNumerosDecimales(e);
        }

        private void chbContrato_CheckedChanged(object sender, EventArgs e)
        {
            txtContrato.Enabled = cbxContrato.Checked;
            if (!cbxContrato.Checked)
                txtContrato.Text = string.Empty;
        }

        private void verAbonosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                int indicefila = dgvDetalleAjuste.SelectedCells[0].RowIndex;
                if (indicefila < 0) return;

                PresentaDetalleMiembro(Convert.ToInt32(
                    dgvDetalleAjuste.Rows[indicefila].Cells["PkMiembro"].Value.ToString()),
                                       Convert.ToInt32(txtCodigo.Text));

            }
            catch
            {
                MessageBox.Show(Resources.MensajeErrorSistema);
            }
        }
        #endregion

        #region Metodos

        #region Eventos

        private void CargaTiposEventos()
        {
            var logica = new Tipo_EventoL();

            DataSet ds = logica.Tipo_EventoConsultarDs(new TipoEvento());

            cbxTipoEvento.DataSource = ds.Tables[0].DefaultView;
            cbxTipoEvento.DisplayMember = "TipoEventoDescripcion";
            cbxTipoEvento.ValueMember = "PK_Tipo_Evento";
        }

        private void GuardarEvento()
        {
            var logica = new EventoL();
            var obj = new Evento();
            logica.EventoGuardar(new Evento
                {
                    
                    FK_Tipo_Evento = Convert.ToInt32(cbxTipoEvento.SelectedValue),
                    EventoGratis = cbxGratis.Checked,
                    EventoContractoReferencia = txtContrato.Text.ToString().Trim(),
                    EventoRegistraAsistencia = chbAsistentes.Checked,
                    EventoCapacidad = Convert.ToInt32(nudCapacidadEvento.Value),
                    EventoContrato = cbxContrato.Checked,
                    EventoCostoPersona = Convert.ToDecimal(txtCostoPorPersona.Text),
                    EventoFecha = dtpFechaEvento.Value,
                    EventoFinCobro = dtpFinalizacionCobro.Value,
                    EventoInicoCobro = dtpFechaInicioCobro.Value,
                    EventoNombre = txtNombre.Text.Trim(),
                    EventoPresupuesto = Convert.ToDecimal(txtPropuesta.Text.Trim()),
                    EventoUbicacion = txtUbicacion.Text.Trim(),
                    FK_Usuario_Evento = VariableGlobales.iCodigoUsuario,
                    PK_Evento = txtCodigo.Text.Trim().Equals(string.Empty) ? 0 : Convert.ToInt32(txtCodigo.Text)
                });

            CargarEventos();
        }

        private void CargarEventos()
        {
            var logica = new EventoL();

            DataSet ds = logica.EventosConsultarDs(new Evento());

            dgvEncabezadoAjuste.DataSource = ds.Tables[0].DefaultView;
            //foreach (DataGridViewColumn columns in dgvEncabezadoAjuste.Columns)
            //{
            //    columns.Visible = false || (columns.Name.Contains("nombreCompleto"));
            //}
        }

        private void EliminarEvento()
        {
            var logica = new EventoL();
            var obj = new Evento();
            logica.EventoEliminar(new Evento
                {
                    FK_Tipo_Evento = Convert.ToInt32(cbxTipoEvento.SelectedValue),
                    EventoGratis = cbxGratis.Checked,
                    EventoRegistraAsistencia = chbAsistentes.Checked,
                    EventoCapacidad = Convert.ToInt32(nudCapacidadEvento.Value),
                    EventoContrato = cbxContrato.Checked,
                    EventoCostoPersona = Convert.ToDecimal(txtCostoPorPersona.Text),
                    EventoFecha = dtpFechaEvento.Value,
                    EventoFinCobro = dtpFinalizacionCobro.Value,
                    EventoInicoCobro = dtpFechaInicioCobro.Value,
                    EventoNombre = txtNombre.Text.Trim(),
                    EventoPresupuesto = Convert.ToDecimal(txtPropuesta.Text.Trim()),
                    EventoUbicacion = txtUbicacion.Text.Trim(),
                    FK_Usuario_Evento = VariableGlobales.iCodigoUsuario,
                    PK_Evento = txtCodigo.Text.Trim().Equals(string.Empty) ? 0 : Convert.ToInt32(txtCodigo.Text)
                });

            CargarEventos();
        }

        #endregion

        #region Miembros

        private void GuardarMiembros()
        {
            var monto = (txtMontoAbono.Text.Trim().Equals(string.Empty) ? 0 : Convert.ToDecimal(txtMontoAbono.Text.Trim()));

            var logica = new Evento_MiembroL();
            logica.Evento_MiembroGuardar(new Evento_Miembro
                {
                    PK_Evento_Miembro = 0,
                    FK_Evento = Convert.ToInt32(txtCodigo.Text),
                    EvMiembroAbono = monto,
                    EvMiembroFechaAbono = dtpFechaAbono.Value,
                    EvMiembroSaldo =
                        (txtSaldo.Text.Trim().Equals(string.Empty) ? 0 : Convert.ToDecimal(txtSaldo.Text.Trim())),
                    EvMiembroObservaciones = txtObservaciones.Text.Trim(),
                    FK_Miembro =
                        (txtCodigoAsistente.Text.Trim().Equals(string.Empty)
                             ? 0
                             : Convert.ToInt32(txtCodigoAsistente.Text.Trim())),
                    Fk_Usuario_MiembroEvento = VariableGlobales.iCodigoUsuario
                });

            Validaciones.LimpiarControles(gbDetalle);

            CargarMiembros(Convert.ToInt32(txtCodigo.Text));
        }

        private void CargarMiembros(int xPK_Evento)
        {
            var logica = new Evento_MiembroL();

            DataSet ds = logica.Evento_MiembrosConsultarDs(new Evento_Miembro
                {
                    FK_Evento = xPK_Evento
                });

            dgvDetalleAjuste.DataSource = ds.Tables[0].DefaultView;

            foreach (DataGridViewColumn columns in dgvDetalleAjuste.Columns)
            {
                columns.Visible = false || (columns.Name.Contains("Nombre") || columns.Name.Contains("Saldo"));
            }
        }

        private void EliminarMiembro()
        {
            int posicion = dgvDetalleAjuste.SelectedCells[0].RowIndex;

            if (MessageBox.Show(
                string.Format("¿Esta Seguro que quiere sacar a '{0}' del evento '{1}'?",
                              dgvDetalleAjuste.Rows[posicion].Cells["Nombre"].Value, txtNombre.Text.Trim()),
                "Confirmacion",
                MessageBoxButtons.YesNo) == DialogResult.No) return;

            var logica = new Evento_MiembroL();
            logica.Evento_MiembroEliminar(new Evento_Miembro
                {
                    PK_Evento_Miembro = 0,
                    FK_Evento = Convert.ToInt32(txtCodigo.Text),
                    EvMiembroAbono =0,
                    EvMiembroFechaAbono =DateTime.Now,
                    EvMiembroSaldo =0,
                    EvMiembroObservaciones = string.Empty,
                    FK_Miembro = Convert.ToInt32(dgvDetalleAjuste.Rows[posicion].Cells["PkMiembro"].Value),
                    Fk_Usuario_MiembroEvento = VariableGlobales.iCodigoUsuario
                });

            Validaciones.LimpiarControles(gbDetalle);

            CargarMiembros(Convert.ToInt32(txtCodigo.Text));
        }

        private void PresentaDetalleMiembro(int xPK_Miembro, int XPK_Evento)
        {
            var pantalla = new Detalle_Miembro(xPK_Miembro, XPK_Evento);

            pantalla.ShowDialog();

            CargarMiembros(Convert.ToInt32(txtCodigo.Text));
        }
        
        public void PresentaMiembro(int xPK_Miembro, string NombreCompleto)
        {
            txtCodigoAsistente.Text = xPK_Miembro.ToString(CultureInfo.InvariantCulture);
            txtAsistente.Text = NombreCompleto.Trim();
        }

        #endregion

        private bool ValidacionesGuardaMiembro()
        {

            int contador = 0;
            Validaciones.Validar(gbDetalle, errorProvider1, ref contador);

            if (contador != 0) 
                return false;

            double monto;
            bool isNum = double.TryParse(txtMontoAbono.Text.Trim(), out monto);
            if (!isNum)
            {
                MessageBox.Show("Solo puede Digitar Montos");
                errorProvider1.SetError(txtMontoAbono, "Digita un Montos");
                txtMontoAbono.Focus();
                return false;
            }

            /*Total Digitado*/
            errorProvider1.SetError(txtMontoAbono, string.Empty);            
            if ((Convert.ToDouble(txtSaldo.Text) - monto) < 0)
            {
                MessageBox.Show("El monto digitado supera el total de lo Costo del evento");
                errorProvider1.SetError(txtMontoAbono, "Monto Superior al Costo");
                txtMontoAbono.Focus();
                return false;
            }

            /*Fecha del Abono*/
            errorProvider1.SetError(dtpFechaAbono, string.Empty);
            if (dtpFechaAbono.Value > dtpFinalizacionCobro.Value || dtpFechaAbono.Value < dtpFechaInicioCobro.Value)
            {
                MessageBox.Show("La fecha del abono se encuentra fuera del rango permitido por el evento");
                errorProvider1.SetError(dtpFechaAbono, "Fuera del Rango");
                dtpFechaAbono.Focus();
                return false;
            }
            return true;
        }

        private bool ValidacionesGuardaEvento()
        {
            errorProvider1.SetError(txtContrato, string.Empty);
            if (cbxContrato.Checked)
            {
                if (txtContrato.Text.Trim().Equals(string.Empty))
                {
                    MessageBox.Show("Tienes que poner Codigo de referencia de Contrato");
                    errorProvider1.SetError(txtContrato,"Digita la Referncia del Contrato");
                    txtContrato.Focus();
                    return false;
                }
            }

            errorProvider1.SetError(txtCostoPorPersona, string.Empty);
            double Num;
            bool isNum = double.TryParse(txtCostoPorPersona.Text.Trim(), out Num);
            if (!isNum)
            {
                MessageBox.Show("Solo puede Digitar Montos");
                errorProvider1.SetError(txtCostoPorPersona, "Digita un Montos");
                txtCostoPorPersona.Focus();
                return false;
            }

            return true;
        }
        #endregion

    }
}